package es.index.logs.parse.apache;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

import es.index.document.logs.apache.ApacheCustomLog;
import es.index.logs.parse.LogsBaseParse;

/**
 * 访问日志解析 格式说明符 说明 <br/>
 * %v 进行服务的服务器的标准名字 ServerName，通常用于虚拟主机的日志记录中。 <br/>
 * %h 客户机的 IP 地址。 <br/>
 * %l 从identd服务器中获取远程登录名称，基本已废弃。 <br/>
 * %u 来自于认证的远程用户。 <br/>
 * %t 连接的日期和时间。 <br/>
 * %r HTTP请求的首行信息，典型格式是“METHOD RESOURCE PROTOCOL”，即“方法 资源 协议”。经常可能出现的 METHOD 是
 * GET、POST 和 HEAD；RESOURCE 是指浏览者向服务器请求的文档或 URL；PROTOCOL 通常是HTTP，后面再加上版本号，通常是
 * HTTP/1.1。<br/>
 * %>s 响应请求的状态代码，一般这项的值是 200，表示服务器已经成功地响应浏览器的请求，一切正常；以 3
 * 开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置；以 4 开头的状态代码表示客户端存在某种错误；以 5
 * 开头的状态代码表示服务器遇到了某个错误。<br/>
 * %b 传送的字节数（不包含HTTP头信息），将日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。<br/>
 * %{Referer}i 指明了该请求是从被哪个网页提交过来的。<br/>
 * %U 请求的URL路径，不包含查询串。 <br/>
 * \"%{User-Agent}i\" 此项是客户浏览器提供的浏览器识别信息。<br/>
 * 
 * @author zhoujin
 */
public class ApacheCustomLogsParse extends LogsBaseParse {

	public ApacheCustomLogsParse() {
		super();
		String keys = "set_serverName,set_ip,set_identd,set_authenticate,set_date,set_jetLag,"
				+ "set_method,set_resource,set_protocol,set_response,set_sendByte,set_referer,set_user_Agent";
		_keys = keys.split(",");
	}

	/**
	 * 对应log中字段
	 */
	@SuppressWarnings("unused")
	private static String[] _parse = new String[] { "%h", "%l", "%u", "%t",
			"%r", "%>s", "%b", "%{Referer}i", "%U", "\"%{User-Agent}i\"" };

	// private static String[] _parse = new String[] { "%v", "%h", "%l", "%u",
	// "%t",
	// "%r", "%>s", "%b", "%{Referer}i", "%U", "\"%{User-Agent}i\"" };

	// private Pattern _date = Pattern.compile("\\[([^\\]]+)\\]");
	//
	// private Pattern _rpm = Pattern.compile("\"([^\"]+)\"\\s");
	//
	// private Matcher _matcher = null;
	//
	// private String[] _dates = null;

	// private String[] _dateArray = null;

	@Override
	protected Object getLogs() {
		ApacheCustomLog log = new ApacheCustomLog();
		// String req =
		// "\\[([^\\]]+)\\]\\s\"([^\"]+)\"\\s\\d{1,4}\\s\\d{0,13}";
		// ([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s
		log.set_id(ID());
		log.set_fileName(_fileName);

		setClassValue(log, 1, "[\\[|\\]|\"]", "");

		return log;
	}

	@Override
	protected void setObjectIntValue(Method method, Object object, String value)
			throws NumberFormatException, IllegalAccessException,
			IllegalArgumentException, InvocationTargetException {
		if (_item.equals("-"))
			method.invoke(object, 0);
		else
			method.invoke(object, Integer.parseInt(_item));
	};

	@Override
	protected Date getDate() {
		return getDefaultDate();
	}

	@Override
	protected void initParseParamete() {
		resolveKeys();
		initParseParamete(ApacheCustomLog.class);
	}

	private static void resolveKeys() {
		// _map = new HashMap<String, String>();
		// _keys = new String[_parse.length];
		// for (int i = 0; i < _parse.length; i++) {
		// if (_parse[i].indexOf("%v") > -1) _keys[i] = "sName";
		// else if (_parse[i].indexOf("%h") > -1) _keys[i] = "sName";
		// "%h", "%l", "%u",
		// "%t", "%r", "%>s", "%b", "%{Referer}i", "%U", "\"%{User-Agent}i\""
		// }
	}

	/**
	 * 设置解析格式，如果需要设置解析格式请在调用inputLogs函数之前调用，否则将会在下次使用时生效
	 * 
	 * @param parse
	 */
	public void setParse(String parse) {
		_parse = parse.split(",");
		resolveKeys();
	}
}
